Untested, but the idea should be obvious:
on *:connect:hadd -m RegNicks $cid $gmt
raw 307:*:if ($comchan($2,0)) { AddReg $2 $gmt }
raw 318:*:var %x = $numtok($2,44) | while (%x) { var %n = $gettok($2,%x,44), %x = %x - 1 | if (!$isregnick(%n)) { AddReg %n $false } }
on *:quit:delreg $nick
on *:part:#:if ($comchan($nick,0) == 1) { delreg $nick }
on *:kick:#:if ($comchan($nick,0) == 1) { delreg $nick }
on *:nick:#:delreg $nick
alias -l AddReg { if (!$hget(regnicks).size) { hadd -m RegNicks $cid $gmt } | hadd RegNicks $+($cid,.,$1-) }
alias -l DelReg { if ($hget(regnicks,$+($cid,$1))) { hdel regnicks $+($cid,.,$1) } }
alias isregnick { return $iif($hget(regnicks,$+($cid,.,$1)),$ifmatch) }
This will function similar to the $ial in that when you do a whois on someone, if they are identified to their nick (it's registered) *AND* they are in at least one room you are in, then they'll be flagged as registered. If they change their nick or leave all the rooms you both are in (quit/get kicked/part), then they are removed from the list. (Someone else could switch to the nick and it's not practical to assume that the user on it is the owner).
Some networks permit you to do multiple nicks on one whois command in the form of /whois nick1,nick2,nick3,etc. so if the network you want to use this on supports that, then it's not too hard to make a script that will do a whois on all who are in rooms with you to fill up your list.

When a /whois is done on someone (or multiple people), it will add a $false value for all the nicks that don't have a timestamp on them. (This makes it easier to know which nicks were already whois'd, but for some reason failed to be seen as a registered nick).
To add: Simple, it runs on it's own. Just get the whois's to list up

To check: $isregnick(nickname) = returns ($null if no whois was done), ($false if a whois was done but doesn't recognize the person as being registered) or (a timestamp ($gmt value) of when the last whois was done that returned the nick as being registered).
If you want it to return the timestamp of when it was first recognized, change the "raw 307" line to read as follows: raw 307:*:if ($comchan($2,0) && !$isregnick($2)) { AddReg $2 $gmt }
Hope this helps out (and works) for you.