Не понимаю зачем внутри метода этот цикл. Можно сделать несколько проще. Смысл в том, чтобы на каждом вызове метода
AlternateCharCases менять регистр буквы
word[startIndex] на нижний и вызывать этот же метод со смещением
startIndex, затем менять регистр на верхний и снова вызывать этот же метод . Наверно не очень ясно выразился, вот работающий код:
static void AlternateCharCases(char[] word, int startIndex, List<string> result)
{
if (word.Length == startIndex)
{
result.Add(new string(word));
return;
}
word[startIndex] = char.ToLower(word[startIndex]);
AlternateCharCases(word, startIndex + 1, result);
word[startIndex] = char.ToUpper(word[startIndex]);
AlternateCharCases(word, startIndex + 1, result);
}