Вывод XML будет содержать заголовок, который основан на кодировке потока, а не на кодировке, указанной в настройках. Поскольку строки имеют 16-битный юникод, кодировка будет UTF-16. Обходной путь - подавить заголовок и добавить его самостоятельно:
writerSettings.OmitXmlDeclaration = true;
Затем, когда вы получите результат от StringBuilder:
string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + sb.ToString();