Wes,
Welcome to the community, hope you enjoy sharing and learning here!
Here is a sample in which I added 2 points and rendered them with different icons. Also you can see how to render the ID as text on it, and how to get the extent which includes all the truck points. Please have a look at the codes and hope that helps.

private void EfficientlyMoveACarImage_Load(object sender, EventArgs e)
{
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
winformsMap1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
// Setup the shapefile layer.
ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"..\..\SampleData\Data\Countries02.shp");
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
winformsMap1.StaticOverlay.Layers.Add("WorldLayer", worldLayer);
InMemoryFeatureLayer truckLayer = GetInMemoryFeatureLayer();
winformsMap1.DynamicOverlay.Layers.Add("TruckLayer", truckLayer);
truckLayer.Open();
// Get the extent which includes all the truck points.
winformsMap1.CurrentExtent = truckLayer.GetBoundingBox();
winformsMap1.CurrentExtent.ScaleUp(20);
truckLayer.Close();
winformsMap1.Refresh();
}
private InMemoryFeatureLayer GetInMemoryFeatureLayer()
{
// Set the columns of the inMemoryFeatureLayer
InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();
inMemoryFeatureLayer.Columns.Add(new FeatureSourceColumn("IconType", "string", 10));
inMemoryFeatureLayer.Columns.Add(new FeatureSourceColumn("ID", "string", 10));
// Set up the 2 features
Feature truck = new Feature(0, 0);
truck.ColumnValues.Add("IconType", "Truck");
truck.ColumnValues.Add("ID", "1");
Feature semiTruck = new Feature(100, 0);
semiTruck.ColumnValues.Add("IconType", "SemiTruck");
semiTruck.ColumnValues.Add("ID", "2");
// Add the 2 features into the feature layer
inMemoryFeatureLayer.InternalFeatures.Add("truck", truck);
inMemoryFeatureLayer.InternalFeatures.Add("semiTruck", semiTruck);
// Add the value style to render the point with different icons
ValueStyle valueStyle = new ValueStyle();
valueStyle.ColumnName = "IconType";
valueStyle.ValueItems.Add(new ValueItem("Truck", new PointStyle(new GeoImage(@"C:\Program Files\ThinkGeo\Map Suite Desktop Evaluation Edition 3.0 (BETA)\Samples\SampleData\Data\Truck.gif"))));
valueStyle.ValueItems.Add(new ValueItem("SemiTruck", new PointStyle(new GeoImage(@"C:\Program Files\ThinkGeo\Map Suite Desktop Evaluation Edition 3.0 (BETA)\Samples\SampleData\Data\Semi Truck.png"))));
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);
// Add the text style to render the IDs
TextStyle textStyle = new TextStyle("ID", new GeoFont("Arial", 20, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.SimpleColors.Black));
textStyle.YOffsetInPixel = 10;
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(textStyle);
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
return inMemoryFeatureLayer;
}
About the performance issue, can you let me know how you update the features and did you use the method Map.RefreshDynamic() to only redraw the dynamic overlay?
Our feature layer does the same way as you described. For example there are 10 points in a layer, if 6 of them are out of the current view, only the rest 4 in the view will be converted to a screen coordinate and drawn on the map. So just added the feature to our feature layer, we will do all the dirty work for you.
Let me know if you have any issues.
Thanks,
Ben