1) Stream uses integer -1 as an end of stream indicator for the ReadByte() method. Consequently, this constant should exist somewhere in the library and ideally as a readonly field or property of stream itself. Consequently, the following becomes doable...
for (int b in myStream.ReadByte(); b != myStream.EndOfStream; b = myStream.ReadByte())
otherStream.WriteByte( (byte) b );
2) Another suggestion is to have inter-stream methods for the sake of completeness and intuitivity, as follows:
aStream.WriteAll( bStream );
and
aStream.ReadAll( bStream );
and
class Stream<T> : IEnumerable<T>
and
....
3) There is just such a lack of symmetry...thank goodness for extension methods....Sealed classes was definitely a mistake (sealed features if you must, but to seal the entire class is to kill the goose the lays the gold eggs).