Если я использую функцию комбинаторики для всех 4 букв, на выходе будут в том числе пересечения ыЫ йЙ и подобные.
Т.к. важно условие что сочетаться могут только разные буквы, но не заглавная и маленькая одной и той же буквы, имхо можно делать признак b, m (большая, маленькая или 1,0) для N-столбцов.
Тогда это будет размещение с повторениям из двух элементов (большая, маленькая для такой-то позиции, то есть буквы) по N (в данном случай окончание слова из 2 букв).
upd:
это называется декартово произведение списка элементов самого на себя (product позволяет перемножать несколько списков) с заданным числом повторов
list(itertools.product('mB',repeat=3))
Out[9]:
[('m', 'm', 'm'),
('m', 'm', 'B'),
('m', 'B', 'm'),
('m', 'B', 'B'),
('B', 'm', 'm'),
('B', 'm', 'B'),
('B', 'B', 'm'),
('B', 'B', 'B')]
А дальше обработать список и на основе номера позиции и значения поставить нужную буквы большую или малую