Preheat oven to 350 degrees. Line a baking pan with parchment paper or foil. If using foil, coat with cooking spray.
To make the meatballs: Place beef, onions, bread crumbs, garlic, egg, ¼ teaspoon salt, and ½ teaspoon pepper in a bowl and combine gently with a fork. With a teaspoon, small scoop or melon baller, shape into 1-inch meatballs, and drop onto a baking sheet lined with parchment paper or foil. They don’t have to be perfectly round. Bake for 20 minutes, until cooked through and lightly browned. Set aside.
In the meantime, for the soup, heat the olive oil over medium-low heat in a large pot. Add the onions, carrots, celery, and sauté until softened, 5 to 6 minutes, stirring occasionally. Add chicken broth, wine, Italian seasoning, and pepper. Bring to a boil, turn heat down to a simmer and cook for 6 minutes. Add the beans and meatballs. Simmer for 2 minutes. Stir in spinach and cook for about 1 minute, until spinach is wilted. Add a little more black pepper, if desired, to taste.
Ladle into soup bowls and sprinkle each serving with 1 tablespoon grated Parmesan cheese, if desired.
This soup freezes great!