Coat a large, straight-sided saute pan with olive oil and heat over medium heat. Add 2 cloves of garlic and a pinch of crushed red pepper and cook until the garlic is golden, about 1 minute. Remove the garlic and discard.
Add half of the spinach to the pan, season with salt and saute until gently wilted. Remove the spinach from the pan to a towel-lined colander set inside a bowl to let the spinach drain and cool. Repeat the process with the remaining garlic and spinach and another pinch of crushed red pepper. Squeeze the towel to remove most of the liquid from the spinach.
Remove any liquid from the bottom of the saute pan and coat lightly with olive oil. Heat the oil over medium heat, add the shallots and season with salt and a pinch of crushed red pepper. Saute until the shallots are translucent and very aromatic, 5 to 7 minutes. Add the butter and, when melted, stir in the flour. Cook until it is the texture of wet sand, 5 to 6 minutes. Whisk in the milk and heavy cream. Taste for seasoning and season with salt, if needed, (it will). Bring the milk and heavy cream to a boil, then reduce the heat and simmer for 5 to 6 minutes, stirring occasionally so the milk doesn't scorch on the bottom. Stir in the Gruyere and Parmigiano until melted. Add the reserved spinach and stir to combine. Taste and adjust the seasoning, if needed. Transfer to a serving bowl, top with a sprinkle of Parmigiano and serve.