Here's an example of using the newfile package to achieve this. It could obviously do with some tweaking. A lot of this is borrowed from answers to this question. Also thanks to Martin Scharrer for comments.

The idea is to write each author bio to a file and then read them all in at the end.

@Seamus: Why shouldn't it work with more than one paragraph? It works fine in my tests. The only trouble I see if \par is redefined in a fragile way. Which can be fixed using: \newcommand\authorbio[2]{{\let\par\relax\addtostream{bios}{\noexpand\item[#1] #2}}}
–
Martin Scharrer♦Apr 8 '11 at 16:27

@Martin Scharrer I hadn't actually thought it through. I was covering my back. It think the way the updated solution works should be even more robust and more easily customisable...
–
SeamusApr 8 '11 at 16:29

1

@Seamus: Also i would recommend using \protect instead of \noexpand. It's much saver in writes. Here it might be ok, but e.g. \addtocontents writes the stuff first into the .aux file and then into the target file like .toc. Therefore you need more than one \noexpand. The \protect is then \noexpand\protect\noexpand :-)
–
Martin Scharrer♦Apr 8 '11 at 16:34

Just for fun, here's Yiannis' answer reimplemented in LaTeX3. The idea is exactly the same: the \AddBio command saves the author name and bio to macros, and uses the sort argument to name them. The sort is also what the authors are sorted by.

This makes use of egreg's solution to how to sort strings in an l3 way. (the code has the answer linked in a comment).