Preheat oven to 350 degrees F.
Heat oil in a large skillet over medium heat. Cook and stir onions until tender; set aside. Cook ground beef until evenly brown and then drain excess grease. Set aside.
Using the same skillet, melt butter and then add flour. Stir with a whisk to combine, making a roux. Gradually whisk in 3 cups of milk and then add in the cream. Simmer while frequently stirring over medium-low heat for 10 minutes or until the sauce has thickened. Season with salt and pepper and remove from heat.
To prevent sticking, spread a small amount of sauce in the bottom of a 9x13 baking casserole dish. Alternate layers of potatoes, onions, ground beef, cheese and sauce, making 2-3 layers of each. Reserve some cheese to sprinkle over the top of the casserole.
Place in preheated oven and bake for 45-55 minutes, or until potatoes are fork tender.