ReadByteメソッドを使うと、Streamからデータを1バイトずつ読み込むことができます。 このメソッドでは、読み込めたデータは戻り値として返されます。 ただし、型はint/Integerとなっているため、読み込めたデータはbyte/Byteにキャストして使います。 ReadByteメソッドの呼び出したとき既にストリームの終端に達していている場合は-1が返されます。

ReadByteメソッドを使ってStreamから1バイトずつデータを読み込む
using System;
using System.IO;

class Sample {
  static void Main()
  {
    using (var stream = File.OpenRead("sample.dat")) {
      for (;;) {
        // streamから1バイト読み込む
        int data = stream.ReadByte();

        if (data == -1)
          // 終端に達した
          break;

        // byteにキャストして表示
        byte b = (byte)data;

        Console.Write("{0:x2} ", b);
      }

      Console.WriteLine();
    }
  }
}

Streamクラス自体はバッファリングを行わないため、Peekなどのような先読みを行うメソッド・プロパティは用意されていません。 先読みを行いたい場合はBinaryReader.PeekCharメソッドあるいはStreamReader.Peekメソッドを使います。 バッファリングを行いたい場合はストリームをBufferedStreamクラスでラップします。 Stream派生クラスでは、FileStreamクラスのようにクラスの機能としてバッファリングを行うように実装されている場合もあります。