We've done a similar thing.
In your xslt used in the core-results webpart, change the URL used when clicking on the users name/photo, so that it opens an application page in a modal dialog (you'll need to attach a javascript file containing the OpenDialogNoRefresh method - which is
just using SharePoint modal dialog framework). E.g.
<div class="inceSearchUserPhoto">
<div id="mouseover" onclick="javascript:OpenDialogNoRefresh('http://inceweb/_layouts/ince.searchparts/peopledetails.aspx?person={$username}','{preferredname} - {$username}')">
<xsl:variable name="imgid" select="concat('CSR_IMG_',$id)"/>
<xsl:variable name="purl">
<xsl:call-template name="GetPicUrl">
<xsl:with-param name="PicUrl" select="pictureurl"/>
<xsl:with-param name="PlaceHolderUrl" select="'/_layouts/images/ince/anon.jpg'"/>
</xsl:call-template>
</xsl:variable>
<img id="{$imgid}" src="{ddwrt:EnsureAllowedProtocol(string($purl))}" alt="{preferredname}" border="0"></img>
</div>
<xsl:if test="$hascol">
<div id="ColleagueField">
<xsl:value-of select="colleaguecategory"/>
</div>
</xsl:if>
</div>
Your application page should read the query string parameter person, and use that to display the persons details from the User Profile Application. E.g.
SPServiceContext serviceContext = SPServiceContext.GetContext(mysite);
UserProfileManager upm = new UserProfileManager(serviceContext);
String samAccount = String.Format("domain\\{0}", person);
if(!upm.UserExists(samAccount))
{
RenderError(String.Format("{0} does not exist in the SharePoint User Profile Store.", person));
return;
}
UserProfile up = upm.GetUserProfile(samAccount);
//Output the required user properties
Ours looks like this: