Как сказал Матиас, вы, скорее всего, создаете шейдер в отдельном контексте, чем тот, с которым вы пытаетесь его использовать. Чтобы это исправить, context2 должен быть создан с помощью sharegroup context1:
EAGLContext* context2 = [[EAGLContext alloc] initWithAPI:context1.API sharegroup:context1.sharegroup];
И после того, как вы создадите shader1 (с context1, являющимся текущим контекстом), обязательно вызовите glFlush () перед переключением на context2, чтобы измененные / созданные ресурсы контекстов были синхронизированы (т.е. создание shader1).