OK, the way the gradients work, this is going to be really tricky and / or expensive at run time. So, I went back to the Pen strategy.

Not bad, and playing with width and pen color and pen alpha might improve it.
and… it’s real simple.
[Serializable]
public class GoDrawingShadow : GoDrawing
{
static float shadowWidth = 2;
public GoDrawingShadow(GoFigure f) : base(f) { }
public override RectangleF ExpandPaintBounds(RectangleF rect, GoView view)
{
InflateRectx(ref rect, shadowWidth, shadowWidth);
return rect;
}
internal static void InflateRectx(ref RectangleF a, float w, float h)
{
a.X -= w;
a.Width += w * 2;
a.Y -= h;
a.Height += h * 2;
}
public override Pen GetShadowPen(GoView view, float width)
{
Pen pen = new Pen(Color.FromArgb(60, Color.Gray), shadowWidth * 2);
return pen;
}
}
and in your GoGeneralNode class, you’d have to override CreateIcon to create this class of GoDrawing object.
and set the Pen of the Icon to be a little darker than the shadow… something like:
pen = new Pen(Color.FromArgb(80, Color.Gray), 1);
and one more thing… set the view.ShadowOffset = new SizeF(0, 0);