Acho que o problema é a tarefa: "Recebi a tarefa de ensinar a outras equipes uma nova base de código".
Você recebeu o trabalho errado ou talvez tenha interpretado mal o trabalho que recebeu.
Ao apresentar no nível do código, você convida a pensar no nível de código.
Comece no nível do sistema e apresente o design e as opções de design que foram feitas. Não permita discussões extensas: você não está revendo. Permitir perguntas: você quer que eles entendam o sistema. Se as pessoas "teriam feito de forma diferente", tudo bem. Talvez concordar. Ou não. Mas siga em frente. É assim que é agora.
Quando você chegar ao nível do código, você já os terá preparado com a terminologia do sistema. Os nomes (suponho) farão sentido. O mesmo que acima: sem discussão extensa, perguntas para entender. Siga em frente.
Agora defina alguns problemas de classe para trabalhar. Como podemos melhorar o X? Escolha algo não trivial que "siga o fluxo" do design do sistema e trabalhe com o que você mudaria. Eles deveriam estar recebendo a lógica do sistema agora. Escolha outro aprimoramento que poderia quebrar o sistema se feito de errado e mostre como isso pode ser feito corretamente. Esse deve ser um momento Ah Ha para eles. Alguns podem até bater em você!
É um show difícil, especialmente depois do falso começo que você teve. Parece que você já investiu muito tempo e esforço, e talvez haja um pouco de mim em relação a eles. 'Confessar e começar de novo. Nós assumimos que eles são pessoas inteligentes. Dê a eles o desafio de pensar no nível mais alto. E divida os grupos que já existem, selecionando seções diferentes de equipes para as novas sessões.