with a List<List<sometype>> you can have a dynamic array in both dimensions and use the two dimensional index operation and are better typed
Then there are beautiful things called extension methods. You put these public static methods in public static classes and mark the first parameter with the "this" keyword so any objec within it's scope looks at it as a member value. Example
now you can call it as such
public static class Extensions
public static int Get2d(this List<Array> x, i1, i2) //this indicates implicit parameter
//bounds checking perhaps
See you're calling the Get2d method, but without passing the list as the first parameter, all List<Array>s sees it as a member method.