Finely chop the onion and mince the garlic.
Boil a medium to large pot of water and add salt. Peel the potatoes and cut into small cubes. Boil for about 10 minutes, until you can easily mash a piece with a spoon or fork.
Heat the oil over medium heat in a large saucepan. Cook the aromatics for 2-3 minutes, until the onions begin to soften.
Add in the ground beef and Worcestershire sauce. Break up the meat into small pieces as it cooks. Brown the meat so no pink remains, another 3-5 minutes.
Then add in the peas and carrots (they can be frozen) and season everything with a little salt and pepper.
Now stir in the tomato paste and beef broth. Sprinkle the flour over everything and stir to incorporate. Cook another couple of minutes. The mixture should turn into a sauce that thickens not quite as much as a gravy but thicker than broth. Remove from heat.
Drain the water from the potatoes, keeping the potatoes in the pot. Add the butter, milk or cream, garlic powder, onion powder, and Parmesan cheese.
Mash until nearly no lumps remain, as we are looking for creamy mashed potatoes. If needed, add more milk or cream if the mashed potatoes seem too thick. They should be easy to spread with a spoon.
In an 8×8 square casserole dish, add the meat mixture. Layer on the potatoes and spread so they cover everything to the edges of the pan.
Bake in the oven at 400°F for 25 minutes. The edges of the potatoes should turn a golden brown and you may see some of the meat gravy bubble up. Top with chopped green onions if using and serve warm.