Иммутабельность строк?
1. Неизменяемость строк используется при операциях сравнения - сравниваются только указатели. Ещё есть вопросы экономии места при повторном использовании, но не уверен, что здесь можно много выиграть.
2. Для активной работы со строками как раз и используются StringBuilder. по сути они представляют собой выделенный массив большого размера, в рамках которого происходит работа со строкой. Во время манипуляций новый массив не создаётся - всё происходит по месту, если не превышается выделенный размер. Если буфера не хватит - выделяется новый, большего размера. Текущий размер буфера можно узнать из свойства Capacity, его можно сразу задать достаточно большим.
Для начала, нужно понимать, что строка - это, по сути, массив символов. Длину массива изменять не принято. Это, конечно, можно сделать, но операция изменения размера массива очень ресурсозатратная. Массив - это данные, которые записаны в памяти последовательно. При попытке изменить размер массива, нет никакой гарантии, что после последнего элемента в массиве есть свободная память, следовательно приходится копировать массив в свободную область памяти. Собственно, по этой причине, размер массива не изменяют.
Для того, чтобы произвести, какие-либо операции над строкой, нужно изменить массив символов.