Если попроще описать, то GraphicsContainer - графический контейнер, принадлежит активному фрейму данных. Содержит графические примитивы и аннотации карты (немного грубовато описано). Объекты, добавляемые в графический контейнер хранятся внутри текущего проекта (файл mxd). Чем больше объектов, тем тяжелее mxd. Layer - слой также принадлежит активному фрейму данных. Хранит не сами данные, а указывает где они лежат и как отображаются. Теперь что значит "рисовать на конкретном слое изнутри" ? Редактировать данные? Или связать графические примитивы с определенным слоем? Для второго варианта необходимо использовать активную группу аннотаций. Попробуйте руками создать в ArcMap с помощью панели Рисования (Draw) новую группу аннотаций и добавьте графический примитив на карту, чтобы понять как это будет работать.
А код будет выглядеть прмерно так:
Option Explicit
Public Sub AddTextToGralayer()
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pTextElement As ITextElement
Set pTextElement = New TextElement
Dim pElement As IElement
Set pElement = pTextElement
pTextElement.Text = "Text in a callout" & vbCrLf & "In middle of screen"
Dim dMidX As Double, dMidY As Double, pPoint As IPoint
dMidX = (pMxDoc.ActiveView.Extent.XMax + pMxDoc.ActiveView.Extent.XMin) / 2
dMidY = (pMxDoc.ActiveView.Extent.YMax + pMxDoc.ActiveView.Extent.YMin) / 2
Set pPoint = New Point
pPoint.PutCoords dMidX, dMidY
pElement.Geometry = pPoint
Dim pTextSymbol As IFormattedTextSymbol
Set pTextSymbol = New TextSymbol
Dim pCallout As ICallout
Set pCallout = New BalloonCallout
Set pTextSymbol.Background = pCallout
pPoint.PutCoords dMidX - pMxDoc.ActiveView.Extent.Width / 4, _
dMidY + pMxDoc.ActiveView.Extent.Width / 20
pCallout.AnchorPoint = pPoint
pTextElement.Symbol = pTextSymbol
' get ICompositeGraphicsLayer
Dim pMap As IMap
Set pMap = pMxDoc.ActiveView.FocusMap
Dim pCompGraLyr As ICompositeGraphicsLayer
Set pCompGraLyr = pMap.BasicGraphicsLayer
Dim pLayer As ILayer
Set pLayer = FindLayerByName(pMap, "Ваш слой")
Dim pGraLyr As IGraphicsLayer
Set pGraLyr = pCompGraLyr.AddLayer("MyLayer", pLayer)
pGraLyr.UseAssociatedLayerVisibility = True
Dim pGraphicsContainer As IGraphicsContainer
Set pGraphicsContainer = pGraLyr
pGraphicsContainer.AddElement pElement, 0
pElement.Activate pMxDoc.ActiveView.ScreenDisplay
pGraLyr.Activate pMxDoc.ActiveView.ScreenDisplay
pMxDoc.ActiveView.PartialRefresh esriViewGraphics, Nothing, Nothing
End Sub
Function FindLayerByName(pMap As IMap, sName As String) As ILayer
Dim i As Integer
For i = 0 To pMap.LayerCount - 1
If pMap.Layer(i).Name = sName Then
Set FindLayerByName = pMap.Layer(i)
End If
Next
End Function