I have a temporary 'hack' solution .. to translate twice, switching space ..
But there must be a better way ..
double[] result1 = new double[8];
object oMin;
object oMax;
vp.GetBoundingBox(out oMin, out oMax);
double[] Min = (double[])oMin;
double[] Max = (double[])oMax;
doc1.MSpace = true;
double[] ll = doc1.Utility.TranslateCoordinates(Min, AcCoordinateSystem.acPaperSpaceDCS, AcCoordinateSystem.acDisplayDCS, 0);
double[] lr = doc1.Utility.TranslateCoordinates(new double[] { Max[0] , Min[1] , 0 },
AcCoordinateSystem.acPaperSpaceDCS, AcCoordinateSystem.acDisplayDCS, 0);
double[] ur = doc1.Utility.TranslateCoordinates(Max, AcCoordinateSystem.acPaperSpaceDCS, AcCoordinateSystem.acDisplayDCS, 0);
double[] ul = doc1.Utility.TranslateCoordinates(new double[] { Min[0], Max[1], 0 },
AcCoordinateSystem.acPaperSpaceDCS, AcCoordinateSystem.acDisplayDCS, 0);
ll = doc1.Utility.TranslateCoordinates(ll, AcCoordinateSystem.acDisplayDCS, AcCoordinateSystem.acUCS, 0);
lr = doc1.Utility.TranslateCoordinates(lr, AcCoordinateSystem.acDisplayDCS, AcCoordinateSystem.acUCS, 0);
ur = doc1.Utility.TranslateCoordinates(ur, AcCoordinateSystem.acDisplayDCS, AcCoordinateSystem.acUCS, 0);
ul = doc1.Utility.TranslateCoordinates(ul, AcCoordinateSystem.acDisplayDCS, AcCoordinateSystem.acUCS, 0);
result1[0] = ll[0];
result1[1] = ll[1];
result1[2] = lr[0];
result1[3] = lr[1];
result1[4] = ur[0];
result1[5] = ur[1];
result1[6] = ul[0];
result1[7] = ul[1];
doc1.MSpace = false;
return result1;