Forget using CGI+. If I go ahead with my Demographics idea I'm going to use Avalon. I managed to spit this out last night in an Avalon app:

The XAML for the page is very straightforward. There's a button, a text block to show some info, and a Canvas that holds the geometry:
<Page x:Class="Demographics.Sandbox2.Page1"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
Loaded="PageLoaded"
>
<StackPanel>
<StackPanel>
<Button Name="goButton" Click="GoButtonClicked">
<TextBlock TextContent="Go" />
</Button>
</StackPanel>
<DockPanel VerticalAlignment="Bottom">
<TextBlock Name="infoTextBlock" />
<Canvas Name="drawCanvas" />
</DockPanel>
</StackPanel>
</Page>
The interesting part of the "code behind" is looping through the X,Y coordinate data (in a DataSet) and drawing the geometry:
//Get a dataset of the state's X/Y coorindates.
//The dataset has two columns we're interested in
//that hold the X/Y coorindate data: ScaledX and ScaledY.
DataSet ds = Boundary.GetPointsForBoundary(BoundaryTypes.State, 1, 50, 4900, 2500);
//clear the canvas
drawCanvas.Children.Clear();
// Create a Path element to render the shapes.
Path myPath = new Path();
myPath.Stroke = Brushes.CornflowerBlue;
myPath.StrokeThickness = 1;
myPath.Fill = Brushes.Goldenrod;
// Create a PathGeometry to contain a PathFigure.
PathGeometry myPathGeometry = new PathGeometry();
// Create a PathFigure to describe the shape.
PathFigure myPathFigure = new PathFigure();
//draw the starting point in the figure
int startX = Convert.ToInt32(ds.Tables[0].Rows[0]["ScaledX"]);
int startY = Convert.ToInt32(ds.Tables[0].Rows[0]["ScaledY"]);
myPathFigure.StartAt(new System.Windows.Point(startX, startY));
//loop through X/Y coordinates and add lines to the figure
foreach (DataRow row in ds.Tables[0].Rows)
{
myPathFigure.LineTo(
new System.Windows.Point(
Convert.ToInt32(row["ScaledX"]),
Convert.ToInt32(row["ScaledY"]))
);
}
//close the shape of the figure, and add the figure
//and geometry objects into the canvas
myPathFigure.Close();
myPathGeometry.AddFigure(myPathFigure);
myPath.Data = myPathGeometry;
drawCanvas.Children.Add(myPath);
Last night I just took a "proof of concept" approach to see if I could even get this far. Ultimately I'd like to add some features so that the user can zoom and pan around and also allow them to select what types of boundaries they want to see (state, zips, or cities).