what you're looking for is more than a simple hack. multiple parts of the posting system will need to be modified (i.e., both the new-post and the edit-old-post sections) in order to really, heavily restrict access. Well, I guess you could quickly change editing to only allow the person who originally wrote the message to edit it. Right now, anyone of the same (or greater) user_level can edit a message in the system.
on the posting side, you'd do much what I said previously, but have to use some kind of table to see what categories a given user can post to. That's getting complex, not something I'd want to write off the cuff (as we'd want a reusable module for people to use, and thus want the WP folks directly involved). you're on the right track, it's just not sitting there as a ready-to-go feature. Of course, the user_level based thing gets you close, but not completely restricting each user.
you could have a manual table in php that lists a username and the matching category name (which is what I'd put in the database were I creating this for larger consumption... ;) ). then modify my code to keep in the base user level stuff (so that people under some user level are fixed to a SINGLE category, but higher-ups can edit everything), but set the default category variable based on the allowed-cat-table[$user_name] lookup. They'd then automatically get the proper category.
Looking at the code, it is now 'stored' in two places (AAARGH):
edit-form-advanced.php AND edit-form.php
Apparently there's now two variations. You'd want to modify the appropriate one.
I'll look at edit-form here.... hmmm....
Looks like the block
<div><?php dropdown_categories($default_post_cat); ?></div>
is the new key thing to wrap my above 'if' statement around. It looks like name='post_category' (instead of 'cat') is likely what would be needed. I'm not altogether sure what the brackets do in an HTTP post, but as the scripts are presuming the category comes through in a list (even if only one), that might set it up as an automatic array or something.
As I said (and as this points out), this isn't a small thing, but someone with a chunk of time and a little php knowledge should be able to turn it around.