En un interesante post (como siempre), el genial Eric Lippert muestra cómo generalizar el cálculo de n productos cartesianos utilizando LINQ. Creo haber estado entre los primeros que identificó el operador SelectMany de LINQ con el cálculo de un producto cartesiano, por allá por 2007 (parece que haya pasado una eternidad :-).