title: FsCheck in C#: generate a list of two dimension arrays with the same shape
body: <p>Let's say I'm writing some code for video analysis. Here is a simplified version of a Video class:</p>
  
  <pre><code>public class Video
  {
      public readonly int Width;
      public readonly int Height;
      public readonly List&lt;int[,]&gt; Frames;
  
      public Video(int width, int height, IEnumerable&lt;int[,]&gt; frames)
      {
          Width = width;
          Height = height;
          Frames = new List&lt;int[,]&gt;();
          foreach (var frame in frames)
          {
              if (frame.GetLength(0) != height || frame.GetLength(1) != width)
              {
                  throw new ArgumentException("Incorrect frames dimensions");
              }
              Frames.Add(frame);
          }
      }
  }
  </code></pre>
  
  <p>How do I make an <code>Arbitrary&lt;Video&gt;</code> and register it? How do I make a shrinker for that Arbitrary?</p>
  
  <p>Tried this, couldn't understand how apply works:</p>
  
  <pre><code>public static Arbitrary&lt;Video&gt; Videos()
  {
      var videoGen = Arb.Generate&lt;PositiveInt&gt;()
          .SelectMany(w =&gt; Arb.Generate&lt;PositiveInt&gt;(), (w, h) =&gt; new {w, h})
          .Apply( /* what is Gen&lt;Func&lt;a,b&gt;&gt; */);
  
      return videoGen.ToArbitrary();
  }
  </code></pre>
  
  <p>Tried this, but couldn't plug the generator for list in here:</p>
  
  <pre><code>public static Arbitrary&lt;Video&gt; Videos()
  {
      var videoGen = Arb.Generate&lt;PositiveInt&gt;()
          .SelectMany(w =&gt; Arb.Generate&lt;PositiveInt&gt;(), (w, h) =&gt; new Video(w, h, /* how to plug generator here? */));
  
      return videoGen.ToArbitrary();
  }
  </code></pre>