Coat a 3-quart casserole dish or 9x13-inch baking dish with nonstick spray. Set aside.
Melt butter in a large sauté pan over medium heat.
Add the onion and cook, stirring frequently, until soft and translucent (about 4 minutes).
Add the garlic and cook for another minute.
Add spinach, stir to combine, then remove from heat and set aside.
In your prepared baking dish, add half bread in a single layer, followed by ½ the spinach mixture, then ½ the green and red peppers, then ½ the ham, then ½ the Gruyere and Parmigiano-Reggiano cheeses. Repeat in the same order with the rest of the ingredients.
In a medium bowl, whisk together eggs, milk, salt and pepper until well combined. Pour in an even layer over the ingredients in the casserole dish. Add more freshly ground pepper, if desired.
Cover with plastic wrap and place in the fridge for at least 1 hour, preferably overnight (up to 12 hours).
Remove casserole from fridge and let come to room temperature while you preheat the oven to 375°F.
Bake for 30 minutes. Loosely cover the dish with aluminum foil and bake for another 20-25 minutes. Casserole is done with browned on the sides and puffy in the center. Mine usually takes about 55 minutes.
Slice, serve and enjoy!