Melt the butter over medium heat in a large saucepan—you want it foaming but not browning, which takes about 2 minutes. I always use a whisk here because it keeps lumps from forming when you add the flour next.
Sprinkle the flour over the melted butter and stir constantly for exactly 2 minutes without letting it brown. This is called a roux, and it's what prevents your homemade queso dip party from becoming a separated mess—the starch particles trap the liquid, which sounds technical but works like magic in practice.
Pour in the whole milk and heavy cream slowly while whisking constantly—rushing this step is where most people go wrong. Keep whisking for about 3 minutes until the mixture thickens enough to coat the back of a spoon; you'll feel the texture change under your whisk, and that's your signal to move forward.
Add the paprika, cayenne, garlic powder, salt, and black pepper, stirring well to distribute the spices evenly. Taste it here—I always do—because this is your chance to adjust before the cheese goes in and makes changes harder.
Reduce the heat to low and add the shredded cheeses in two batches, stirring after each addition until completely melted. This prevents clumping because cold cheese hitting boiling liquid seizes up; taking it slow keeps everything smooth and prevents lumps that ruin the texture.
Fold in the diced fresh jalapeno gently at the end, which adds brightness without cooking down to nothing. The pepper stays firm and gives you that unexpected bite that separates this crowd queso from versions that taste one-dimensional.
Transfer to a serving bowl or small slow cooker set on the lowest setting to keep it warm during your party. If you're serving it immediately without keeping it warm, just let it sit in the bowl—it'll stay at serving temperature for at least 45 minutes.