Luciano,
Em relação a sua dúvida de cadastro de professor, é necessário ressaltar que são dois processos separados.
O primeiro é o cadastro de usuário na Plataforma Moodle. O segundo é vincular o usuário cadastrado em um determinado curso com perfil professor. Assim, se precisar alocar o mesmo usuário em outro curso seja com perfil professor ou não, não é necessário repetir o primeiro passo. Isso porque o cadastro é único. Se não seguir essa regra, pode gerar duplicidade de cadastro.
O Moodle é sistematizado em plugins. Para cada processo, existe um tipo de plugin diferente. Para cadastro de usuários, usa-se o plugin de tipo autenticação. No repositório do Moodle há uma lista desses tipos de plugins que pode ser explorados nesse link https://moodle.org/plugins/browse.php?list=category&id=21
Já para efetuar inscrição no curso, por padrão o Moodle usa plugins de tipo inscrição. Para explorar esses tipos de plugin no repositório, explore esse link: https://moodle.org/plugins/browse.php?list=category&id=22
Há alguns tipos de plugins que faz combinação das duas coisas. Neste caso, explore a lista de plugins no repositório e veja se encontra o que lhe atende.
Se não encontrar nenhum, a alternativa é desenvolver. Neste caso sugiro seguir seguinte lógica:
1) Não estando logado no Moodle, o formulário de cadastro exibe apenas o campo de checagem de duplicidade. Pode ser o CPF. Neste caso, o usuário digita do CPF. Se já tiver cadastro, o campo senha é exibido. Se não tiver cadastro, os demais campos de cadastro serão exibidos;
2) Se já tiver o cadastro, coloque a senha. Ao autenticar, visualiza uma lista de cursos que deve acessar. Ao clicar, será inscrito automaticamente caso não estiver inscrito ainda;
3) Se não tiver estiver cadastrado, preenche o formulário e em seguida visualiza uma lista de cursos que deve acessar. Ao clicar, será inscrito automaticamente caso não estiver inscrito ainda;
Esse fluxo pode ser implementado dentro de um plugin seja de tipo autenticação ou de inscrição. Pode também, não criar um plugin, criar um código adicional na pasta _extra ou qualquer pasta arbitrária e implementar essa lógica. Essa última opção não segue padrão. É uma gambiara, o que é recomendado só em situações emergenciais.