In a large skillet, heat some olive oil over medium heat and cook the spinach for a few minutes until reduced (you may do this in parts). Transfer to a plate and let it cool down slightly. Remove excess moisture by squeezing the spinach with your hands and patting dry with paper towel.
In the same skillet, heat about 2 tablespoons of olive oil over medium heat. Add the sliced onions on a single layer and cook for about 10 minutes, stirring occasionally, until softened and caramelized. Heat some more olive oil and add the garlic. Cook another 1-2 minutes until fragrant. Season with salt and pepper to taste. Set aside.
In a large bowl, evenly toss the cubed bread, artichoke hearts, cheeses, the prepared spinach, and the caramelized onion and garlic mixture. Transfer to a lightly greased 9x13 baking pan. Set aside.
In a medium bowl, whisk the eggs, half and half, 1 1/2 teaspoons salt, and the 1/4 teaspoon ground black pepper. Pour this egg mixture evenly over the prepared bread mixture, even through the corners and edges. Cover with foil and refrigerate for at least 2 hours or overnight.
When ready to bake, preheat oven to 350 degrees F. Bake for 30 minutes with the aluminum foil on. Remove foil and continue baking for another 45-50 minutes. Let it sit for 5 minutes before serving. Enjoy!