Splicing enumerables together
My comment is that you can write your desired method with far more generality, no recursion, and far less realization into lists. For example:

using System;
using System.Linq;
using System.Collections.Generic;   

public class Program
{
    public static IEnumerable&lt;R&gt; Zipper&lt;A, R&gt;(IEnumerable&lt;IEnumerable&lt;A&gt;&gt; sequences, Func&lt;IEnumerable&lt;A&gt;, R&gt; f)
    {
        var enumtors = sequences.Select(seq =&gt; seq.GetEnumerator()).ToList();
        while(true)
        {
            // Not quite kosher, as we are using Select to cause a side effect!
            var hasValues = enumtors.Select(e =&gt; e.MoveNext());
            if (hasValues.Any(v =&gt; !v)) 
                break;
            yield return f(enumtors.Select(e =&gt; e.Current));
        }
        foreach(var enumtor in enumtors)
          enumtor.Dispose();
    }

    public static void Main()
    {
        foreach(var s in Zipper(
            new[] { 
              new[] {1, 2}, 
              new[] {3, 4}, 
              new[] {5, 6, 7} }, 
            x =&gt; string.Join("-", x))) 
          Console.WriteLine(s);
    }
}


Produces output

1-3-5
2-4-6


Note that my version works on infinite lists provided that there are finitely many of them.  Note also that my method is "lazy"; it only makes computations when the caller "pulls" something.