Alla fine ho fatto questa cosa, ho ripreso un vecchio codice che avevo fatto tempo fa e l'ho adattato.
Posto che magari puo' servire a qualcuno.
Parte javascript
codice:
// -----------------------------------------------------------------
// la funzione restituisce le coordinate di un elemento
// -----------------------------------------------------------------
function getPageCoords (element) {
var coords = {x: 0, y: 0};
while (element) {
coords.x += element.offsetLeft;
coords.y += element.offsetTop;
element = element.offsetParent;
}
return coords;
}
function locateObject(n, d) { //v3.0
var p,i,x;
if(!d) d=document;
if((p=n.indexOf("?"))>0&&parent.frames.length)
{
d=parent.frames[n.substring(p+1)].document;
n=n.substring(0,p);
}
if(!(x=d[n])&&d.all) x=d.all[n];
for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=locateObject(n,d.layers[i].document);
return x;
}
// -----------------------------------------------------------------
// visualizza il menu
// -----------------------------------------------------------------
function showMenu(val,altezza)
{
//si costruisce il menù
menu='<table border="0" width="130" id="tblContestuale" cellspacing="0" cellpadding="3">';
menu+='<tr><td><a href=\"pag1.aspx?ID='+val+'\">Voce 1</a><td><tr>';
menu+='<tr><td><a href=\"pag2.aspx?ID='+val+'\">Voce 2</a><td><tr>';
menu+='<tr><td><a href=\"pag3.aspx?ID='+val+'\">Voce 3</a><td><tr>';
menu+='<tr><td><a href=\"pag4.aspx?ID='+val+'\">Voce 4</a><td><tr>';
menu+='<tr><td><a href=\"pag5.aspx?ID='+val+'\">Voce 5</a><td><tr>';
menu+='<tr><td><a href=\"pag6.aspx?ID='+val+'\">Voce 6</a><td><tr>';
menu+='</table>';
locateObject('MenuCont').style.top=altezza+10 //la funzione mi riprende l'oggetto MenuCont a cui passa la nuova altezza
menuv = menu.replace(';','');
locateObject('MenuCont').innerHTML = menuv
//si calcola la left
// -----------------------------------------------------------------
if ((event.x + locateObject('MenuCont').clientWidth) > (document.body.clientWidth + document.body.scrollLeft))
locateObject('MenuCont').style.left = (document.body.clientWidth + document.body.scrollLeft) - locateObject('MenuCont').clientWidth-10;
else
locateObject('MenuCont').style.left=document.body.scrollLeft+event.clientX;
// si calcola la top
// -----------------------------------------------------------------
if ((event.y + locateObject('MenuCont').clientHeight) > (document.documentElement.clientHeight))
locateObject('MenuCont').style.top = document.documentElement.scrollTop+event.y-locateObject('MenuCont').clientHeight;
MenuCont.style.visibility="visible";
document.getElementById("divWait").style.display = 'none';
}
// funzione che nasconde il menù
function hideMenu()
{
if (document.all)
{
locateObject('MenuCont').style.visibility="hidden"
locateObject('MenuCont').style.left = 1;
locateObject('MenuCont').style.top = 1;
return false
}
else if (document.layers)
{
locateObject('MenuCont').visibility="hide"
locateObject('MenuCont').left = 1;
locateObject('MenuCont').top = 1;
return false
}
else
return true
}
nell'html viene definito il DIV del menù
codice:
<div id="MenuCont" style="position: absolute; visibility: hidden; width: 100px; z-index: 1000;
left: 0; top: 0">
</div>
lato server nel Page_Load della pagina viene aggiunta la riga sottostante,
al click con il tasto sinistro nel gridview il menù contestuale viene nascosto.
codice:
grdTest.Attributes.Add("onclick", "hideMenu()");
Infine nell'evento RowDataBound del gridview, io l'ho messo solo nella cella 1 , ma volendo con un ciclo si puo' mettere in tutta la riga.
codice:
e.Row.Cells[1].Attributes.Add("oncontextmenu", "p=getPageCoords(this);showMenu('" + rowView.Id + "',p.y);return false;");
Sicuramente ci sono modi migliori..ma al momento mi è uscito questo 
ciao ciao