I figured it out!

I tried once again to turn the camera by 180 degrees and it worked. I had to change the matrix I used to create the final model-view matrix so that it could work. Here's how I do it.

Calculating the projection matrix
[code=delphi]
FProjMat := Mat4CreateOrtho(0, FWidth, 0, FHeight, -1.0, 1.0);
[/code]
Calculating the view matrix
[code=delphi]
CachedMatrix := Mat4Rotate(Mat4Identity(), Euler(0.0, 180.0, 0.0))
[/code]
Rendering the text
[code=delphi]
procedure TBrain2DText.RenderText(const Camera: TBrainCamera;
const AText: String; const ATextSize: Single; const AFont: TBrainFont);
var
CurX: Single;
Ch: Char;
Chaar, I, Ind: Integer;
ProjMat, ModelMat, ModelView: TBrainMatrix;

{ .: AddQuad :. }
procedure AddQuad(X, Y, Wid, Hgt, Tu, Tu2, Tv, Tv2: Single);
var
V: array [0 .. 3] of TBrainVector;
begin
TexCoords.Add(TexCoord(Tu, Tv));
TexCoords.Add(TexCoord(Tu2, Tv));
TexCoords.Add(TexCoord(Tu2, Tv2));
TexCoords.Add(TexCoord(Tu2, Tv2));
TexCoords.Add(TexCoord(Tu, Tv2));
TexCoords.Add(TexCoord(Tu, Tv));

V[0] := Vec3(-X, Y, 0.0);
V[1] := Vec3(-(X + Wid), Y, 0.0);
V[2] := Vec3(-(X + Wid), Y - Hgt, 0.0);
V[3] := Vec3(-X, Y - Hgt, 0.0);

Vertices.Add(V[0]);
Vertices.Add(V[1]);
Vertices.Add(V[2]);
Vertices.Add(V[2]);
Vertices.Add(V[3]);
Vertices.Add(V[0]);
end;

begin
// Before we begin, check if we have everything we need
if not Assigned(Camera) then
exit;
if not Assigned(Shader) then
exit;
if (AText = '') then
exit;
if not Assigned(AFont) then
exit;
if (ATextSize = 0.0) then
exit;

// If there are any leftovers from previous text, remove it
Vertices.Clear();
TexCoords.Clear();

// We are provided with parameters, so it's time to render
// the text
CurX := -Position.X;
if not (AFont.FontLoaded) then
exit;

// Iterate through the text
for I := 1 to Length(AText) do
begin
// Get the current character
Ch := AText[I];
Chaar := Integer(Ch);

// Check if the current character is a legal one
// (i.e. neither #10 nor #13). If it is, also check
// if it's not the Space character. If so, move the cursor
Ind := -1;
case Chaar of
32:
CurX := CurX + AFont.SpaceWidth * ATextSize;
10, 13: // No line-breaks supported
break;
else
Ind := AFont.CharacterLookup[Chaar];
end;

// If we have a valid character...
if (Ind > -1) then
begin
// Setup the cursor
CurX := CurX + AFont.CharacterInfo[Ind].A * ATextSize;

// Add a new quad which contains the character
AddQuad(CurX, Position.Y, AFont.CharacterInfo[Ind].Width * ATextSize,
AFont.CharacterInfo[Ind].Height * ATextSize, AFont.CharacterInfo[Ind].x1,
AFont.CharacterInfo[Ind].x2, AFont.CharacterInfo[Ind].y1,
AFont.CharacterInfo[Ind].y2);

// Move the cursor to the next character
CurX := CurX + AFont.CharacterInfo[Ind].C * ATextSize;
end;
end;
// Notify the object that its structure has changed
Self.StructureChanged();

// Enable blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// Switch to the orthographic projection, enable the shader,
// and bind the texture
Camera.ProjectionType := ptOrthogonal2D;
Camera.ForceMatrixRecalc();

Shader.Enable();
AFont.FontTexture.Bind(0);
AFont.FontTexture.Apply();

// Calculate the matrices
ProjMat := Camera.ProjectionMatrix;
ModelMat := Mat4Translate(Mat4Identity(), Vec3(Position.X, Position.Y, 0.0));
ModelView := Mat4Multiply(ModelMat, Camera.Matrix);

// Update the shader
Shader.SetMatrix(ProjectionMatrixUniformName, @ProjMat);
Shader.SetMatrix(ModelViewMatrixUniformName, @ModelView);

// Finally, render the text using triangle strips
glBindVertexArray(GetVAO());
glDrawArrays(GL_TRIANGLE_STRIP, 0, Vertices.Count);
glBindVertexArray(0);

// Restore to defaults
Camera.ProjectionType := ptPerspective;
Camera.ForceMatrixRecalc();

glDisable(GL_BLEND);
end;
[/code]

Hope this helps.