Como gerar combinação de elementos N com fornecimento limitado de 2 cada, sem loops aninhados explícitos

Se N for fixo, como N = 3, é fácil, posso usar loops aninhados de profundidade 3. por exemplo,

from i in Enumerable.Range(0, 2)
from j in Enumerable.Range(0, 2)
from k in Enumerable.Range(0, 2)
select new int[] { i, j, k };

e se N for uma variável?

questionAnswers(1)

yourAnswerToTheQuestion