System.IO.Stream использует шаблон декоратора, поэтому он довольно легко позволяет создать собственный, который оборачивает основной поток. Это позволяет таким потокам, как CryptoStream и GZipStream, обернуть любой другой экземпляр Stream и эффективно «переопределить» его методы чтения / записи, не выходя из класса, который вы хотите расширить. Очень гибкий и популярный шаблон дизайна, описанный в книге «Банды четырех».
Теперь я не уверен, требует ли API, с которым вы работаете, Stream или StreamReader. Существует значительное различие между ними. StreamReader работает на уровне text и работает с символами / строками. Поток работает на двоичном уровне и работает с байтами. Другими словами, ожидается, что StreamReader сможет декодировать байты в текст, чтобы потребителю не нужно было беспокоиться о кодировке. Используйте Stream, если кодирование не имеет значения (например, при сжатии или кодировании), и используйте StreamReader при работе с текстовыми данными.
Судя по тому, как это звучит, StreamReader будет иметь больше смысла. Если API может принимать StreamReader, просто извлеките свой собственный из TextReader и переопределите его метод ReadLine, чтобы первый вызов возвращал строку текста, к которой вы хотите добавить, а последующие вызовы просто функционируют как обычно.
Другой вариант - просто использовать StringWriter / StringReader и поместить все это в строковый буфер в памяти, манипулировать им, а затем передавать его.