I would recommend taking a look at the content profile module: http://drupal.org/project/content_profile. With this module you can specify a content type to be used for user profiles. By doing this you can leverage CCK and do anything with this profile node that you could with any other type of node (list with views, panels, style it with node.tpl.php, etc.).
Also, you can have different roles assigned to different content profiles by setting node permissions appropriately. For example you would want to check "create teacher_profile content" and "edit own teacher_profile content" where "teacher_profile" is the name of the content type you would create. You could then create a second role called "student" and a second content type called "student_profile" and apply similar permissions to allow only students to create and edit their respective profiles of this different content type.