after a short search i found that you can do it using the CartesianProduct Extension Method from Eric Lippert's Blog:
var result = list.GroupBy(t => t.Key).CartesianProduct();
as it is doing:
static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] {item}));
}