It turns out that the primitive shapes have the following structure ("TopSand" is what I named my primitive shape). ModelComponent isn't on the shape entity itself, but rather on it's first child.
To get the code from above working, I needed to access the child entity "usdPrimitiveAxis" and work with it's ModelComponent, ex:
guard let shapeEntity = rootEntity.findEntity(named: "TopSand"),
let modelEntity = shapeEntity.children.first as? ModelEntity,
var modelComponent = modelEntity.components[ModelComponent.self],
var shaderGraphMaterial = modelComponent.materials.first as? ShaderGraphMaterial else {
return
}
// Modify modelEntity as needed