There were some key things the client wanted/needed regarding the online safety of the students. Although the students have profiles, only registered members (students/teachers/scientists/engineers) can see them. And even then the students real names are only visible to themselves, their own teachers, and admins.
Also, the avatars are only selectable from a fixed set. No Gravatar/sign up with Facebook/Twitter here, so there is never the opportunity for a real photo of any of the students to appear.
The students were encouraged to use aliases, explicitly told not to user their own names for login names (though that isn't actually policed), and the signup process is done as part of (science) lessons.
The sign up process requires a unique sign up id that is printed on instruction cards and sent round to schools. No ID - no way to register. Both teachers and students needed those and the IDs are predefined to determine role (teacher/student) and zone (sub-site). Scientists/engineers are imported up by hand by the client's staff (though they too have a unique ID that determines role and zone).
Finally, all student and teacher generated content -- questions (posts), comments, and live chats are pre-moderated!
Your project sounds like a much smaller scale so I don't think you need to go as far as printed sign up cards. Still, no real names, no Gravatars, and pre-moderate all content will go a long way to keeping things safe.
Get the teachers to sign up the kids manually, and it will save you having to write a lot of custom code (but not all).
If they have trouble with coming up with login names, create a spreadsheet with a list of unique names they can use to record real names against - use something like random colour + random animal to generate your names.
Note also that in our experience, lot's of school kids don't have emails addresses (or they can't access them at school) or they have a shared email address for the class (especially the younger classes and smaller schools). WordPress does not like either situation. You will have to write some custom filters around that.
Mike