以下の例では、名前付きグループとキャプチャを使ってCSVの各レコードからフィールドの値を抽出し、表形式に整形しています。 この例で使用する正規表現は複雑になるため、構成要素毎に分けた正規表現を組み立てています。 それぞれの正規表現は次のようになっています。

recordPattern = ((^|,)fieldPattern)*$
レコード(1行分)のパターン
行頭^またはカンマ,の後にfieldPatternが続く組み合わせが0個以上続き(*)、最後に行末$が出現する文字列で構成される
fieldPattern = (quotedFieldPattern|plainFieldPattern)
レコード内の各フィールドのパターン
クオートされたフィールドquotedFieldPattern、もしくはクオートされていないフィールドplainFieldPatternで構成される
quotedFieldPattern = "(?<value>(""|[^"])*?)"
クオートされているフィールドのパターン
開きの二重引用符"、クオートされた値((?<value>...)の部分)、閉じの二重引用符"で構成される
クオートされた値は、エスケープされた二重引用符""または閉じの二重引用符以外の文字[^"]が0個以上続く(*?)文字列で構成される
(ここでは(""|[^"])が閉じの二重引用符にマッチしないよう、*ではなく最短一致の*?を使用する)
plainFieldPattern = (?<value>[^,]*)
クオートされていないフィールドのパターン
カンマ以外の文字([^,])が0個以上続く(*)文字列で構成される

なお、最終的に組み立てられた正規表現は実行結果として出力しています。 また、この例で使用している正規表現では、名前付きグループvalueに複数のフィールドがキャプチャされるため、Group.Capturesプロパティを参照してキャプチャしたフィールドの値を列挙しています。

正規表現を使ってクオートを含むCSVの各レコードからフィールドの値を抽出する
using System;
using System.Text.RegularExpressions;

class Sample {
  static void Main()
  {
    var plainFieldPattern  = "(?<value>[^,]*)";
    var quotedFieldPattern = "\"(?<value>(\"\"|[^\"])*?)\"";
    var fieldPattern       = $"({quotedFieldPattern}|{plainFieldPattern})";
    var recordPattern      = $"((^|,){fieldPattern})*$";

    Console.WriteLine(recordPattern);
    Console.WriteLine();

    var records = new[] {
      "type,example,max value",
      "",
      "int,\"0, 16, 42\",int.MaxValue",
      "double,3.14,double.MaxValue",
      "bool,\"true, false\",",
      "string,\"\"\"foo\"\", \"\"bar\"\"\",",
    };

    foreach (var record in records) {
      Console.WriteLine("<{0}>", record);
    }

    Console.WriteLine();

    foreach (var record in records) {
      var m = Regex.Match(record, recordPattern);

      if (m.Success) {
        foreach (Capture c in m.Groups["value"].Captures) {
          Console.Write("|{0,-20}", c.Value.Replace("\"\"", "\""));
        }
      }

      Console.WriteLine();
    }
  }
}
実行結果
((^|,)("(?<value>(""|[^"])*?)"|(?<value>[^,]*)))*$

<type,example,max value>
<>
<int,"0, 16, 42",int.MaxValue>
<double,3.14,double.MaxValue>
<bool,"true, false",>
<string,"""foo"", ""bar""",>

|type                |example             |max value           
|                    
|int                 |0, 16, 42           |int.MaxValue        
|double              |3.14                |double.MaxValue     
|bool                |true, false         |                    
|string              |"foo", "bar"        |