Heat olive oil in a large pot over medium high heat. Add the ham and cook until golden and crisp, 1-2 minutes per side. Set aside and dice once cooled (if not already diced), I crisp whole slices of ham and dice it after.
Turn the heat off and add the wine. Set the heat to medium and use a silicone spatula to “clean” the bottom and sides of the pot. Let it bubble gently and reduce by half, about 4 minutes.
Melt the butter and add the garlic. Cook for 1 minute. Add the onions, carrots, celery, Worcestershire sauce, hot sauce, and seasonings. Stir to combine and soften for 5-6 minutes.
Add the drained pinto beans, then the chicken broth and heavy cream, if using. Bring to a boil, then reduce to a simmer.
Add the ham back. Let it simmer, partially covered, for 30 minutes. (Run a silicone spatula along the bottom every 10 minutes or so, to lift any ingredients settling to the bottom.)
Add the spinach and let it wilt, about 3 minutes.
Taste, and adjust any seasonings as needed. Transfer to serving bowls and sprinkle with freshly grated Parmesan cheese if desired.