> Could this default to options.map.getView().getProjection() (if options.map is defined)?

The map may not have a view when the Graticule component is created.

> I haven't looked closely, but is there any reason that the graticule would have a different projection than the map?

No.

>  Assuming setMap will eventually be called with a map, could the projection always be taken from the map?

The Graticule would also need to listen to change:view events from the map, and change:projection events from the view.

Another (I think better) option would be to use the projection set in the view2DState. I can give this a try if you agree with the approach.