Recursion is easier to understand when you stop trying to look at the whole picture.

Use classes for actions.

using System;

interface List<T> {
  int Length();
}

class Nil<T> : List<T> {
  public int Length() { return 0; }
}

class Cons<T>: List<T> {
  public Cons(T head, List<T> tail) {
    Head = head;
    Tail = tail;
  }
  public T Head;
  public List<T> Tail;

  public int Length() {
    return 1 + Tail.Length();
  }
}

class MainClass {
  public static void Main (string[] args) {
    Console.WriteLine (new Cons<int>(1, new Cons<int>(2, new Nil<int>())).Length());
  }
}