列挙体をメンバ名の順(値に割り当てられている名前の順)に並べるには、次のように並べ替え順序を定義する必要があります。 ただ、次の例にあるように、列挙体ではメンバ名で定義されていない値も設定できるため、そういった値をどう取り扱うかについての考慮も必要となってきます。
列挙体の値をメンバ名の順にソートする
      using System;
enum Number {
  MinusTwo = -2,
  MinusOne = -1,
  Zero = 0,
  One = 1,
  Two = 2,
}
class Sample {
  // 列挙体の値を比較するメソッド
  static int CompareNumber(Number x, Number y)
  {
    // 列挙体の値を文字列(メンバ名)に変換
    var xx = x.ToString("G");
    var yy = y.ToString("G");
    // 文字列として比較した結果を返す
    return string.Compare(xx, yy);
  }
  static void Main()
  {
    var arr = new Number[] {
      Number.Zero, Number.One, Number.MinusOne, Number.Two, Number.MinusTwo,
      (Number)3, // <- 列挙体のメンバで定義されていない値
    };
    Array.Sort(arr, CompareNumber);
    foreach (var val in arr) {
      Console.WriteLine("{0,-8:G} ({0:D})", val);
    }
  }
}
       
      実行結果
      3 (3) MinusOne (-1) MinusTwo (-2) One (1) Two (2) Zero (0)