In a large bowl, combine beef mince, pork mince, egg, garlic, ½ teaspoon salt, and ¼ teaspoon black pepper. Mix gently until just combined. Roll into walnut-sized balls (3cm diameter). Set aside.
Heat 2 tablespoons olive oil in a large frying pan over medium-high heat. Brown meatballs in batches for 5–6 minutes, turning to get all sides golden. Transfer browned meatballs to a large soup pot.
Pour 2 litres water into the pot with meatballs. Add whole onion with skin. Bring to a boil, then reduce to medium simmer.
Dice potatoes, slice carrots, chop celery, and dice peeled onion while broth heats.
Season broth with 1 teaspoon salt, ½ teaspoon black pepper, and 1–2 teaspoons dill. Add all diced vegetables. Simmer 25–30 minutes, stirring occasionally, until vegetables are tender.
Stir in drained cannellini beans and let warm for 5 minutes.
Remove whole onion. Add fresh spinach and stir until wilted (1–2 minutes). Taste and adjust seasoning.
Serve hot in deep bowls with 3–4 meatballs per portion. Swirl in double cream if using. Garnish generously with parsley.