Preheat the oven to 400 degrees.
Bring a large saucepan filled with salted water to a boil over medium-high heat and blanch the Brussels sprouts until just tender - about 3 to 7 minutes (it depends on the freshness and the size of the sprouts).
Drain Brussels sprouts in a colander. Rinse gently under cold water to stop the cooking.
Melt 2 tablespoons of the butter in a large skillet (I like to use my cast iron so I can use the same pan for the stovetop as I do for the oven). Saute the shallots until tender, then add the minced garlic. Cook for an additional 30-60 seconds.
Add the remaining 2 tablespoons of butter. Once it melts, whisk in the flour to make a roux. Slowly add in the chicken broth followed by the milk, while whisking, until thickened and smooth. Add half of the gruyere cheese and season with salt and pepper to taste.
Add the Brussels sprouts to the sauce and stir to combine. If using a cast iron skillet or an ovensafe pan, just leave it in the pan. If you are not, then transfer the mixture to a 2 quart casserole dish. Sprinkle with the remaining gruyere cheese.
Bake at 400 degrees for about 30 minutes. It should be golden brown and bubbly. I like to crank up my heat to broil and broil it for a couple minutes just for a little more browning. Let this sit for 10 minutes before serving.