Другой вариант - использовать Enumerable # map с Object # tap следующим образом:
str = 'hello'
str.size.times.map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } }
#=> ["Hello", "hEllo", "heLlo", "helLo", "hellO"]
Необходимо дублировать исходную строку, чтобы избежать изменения исходная строка, которая будет возвращать ["HELLO", "HELLO", "HELLO", "HELLO", "HELLO"]
Для пропущенных пробелов:
str.size.times.flat_map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } unless str[n] == ' ' }