Prep your base. If using pasta, bring a large pot of salted water to a boil and cook until just shy of al dente. Drain and set aside. If using potatoes, slice them thinly and par-cook in salted boiling water for 4–5 minutes, then drain.
Sauté the aromatics. Heat olive oil in a large skillet over medium heat.
Add the diced onion (and bell pepper if using) and cook 4–5 minutes until softened. Stir in garlic and cook 30 seconds until fragrant.
Brown the beef. Add ground beef and break it up with a spatula. Season with salt, pepper, Italian seasoning, and paprika.
Cook until browned with no pink remaining. If there’s excess fat, drain it.
Build the sauce. Stir in crushed tomatoes, beef broth, Worcestershire, and red pepper flakes if using. Simmer 5–7 minutes until slightly thickened.
Taste and adjust salt and pepper. You want a savory, slightly tangy sauce.
Make it creamy. Remove the skillet from heat and stir in sour cream. This softens the acidity of the tomatoes and adds body.
If the sauce seems too thick, splash in a bit more broth.
Combine with your base. If using pasta, add it directly to the skillet and toss to coat. If using potatoes, you’ll layer them in the baking dish with the sauce.
Assemble the casserole. Preheat your oven to 375°F (190°C). Grease a 9x13-inch baking dish.
Add half the beef mixture, sprinkle half the cheddar and mozzarella, then add the remaining mixture and top with the rest of the cheese. If adding peas or corn, fold them in before topping with cheese.
Bake until bubbly. Cover loosely with foil and bake for 15 minutes. Remove the foil and bake another 10–15 minutes until the cheese is melted, bubbling, and lightly golden.
Rest and garnish. Let the casserole rest 5–10 minutes so it sets slightly.
Sprinkle chopped parsley or green onions on top for a fresh pop.
Serve. Scoop generous portions and enjoy with a simple green salad or steamed veggies. Garlic bread doesn’t hurt either.