You were going in then right direction, but your row counting was all over the place, which is why the table didn't work. Try the following (and do declare all your variables)
Option Explicit
Sub CreateTable()
'Count the number of controls with the tag module and make that many rows in the table
Dim oTable As Table
Dim ctl As ContentControl
Dim rng As Range
Dim x As Long, t As Long, m As Long, d As Long
Set rng = ActiveDocument.Range
rng.Collapse 0 'Put the range at the end of the document
x = 1 'set the initial value for x
t = 1: m = 1: d = 1 'set the initial values for t,m & d
For Each ctl In ActiveDocument.ContentControls
If ctl.Tag = "Module" Then
x = x + 1
End If
Next
'
'
'Create the table with 3 columns and x number of rows
Set oTable = ActiveDocument.Tables.Add(Range:=rng, NumRows:=x, NumColumns:=3)
oTable.Rows(1).Cells(1).Range.Text = "Time"
oTable.Rows(1).Cells(2).Range.Text = "Module"
oTable.Rows(1).Cells(3).Range.Text = "Description"
oTable.Rows(1).Shading.BackgroundPatternColor = wdColorGray10
'
'Insert data into table based on when it is received in the loop.
'Each type of data goes it its own column (of 3) and each set goes into its own row.
With oTable
For Each ctl In ActiveDocument.ContentControls
If ctl.Tag = "Time" Then
t = t + 1
.Cell(Row:=t, Column:=1).Range.Text = ctl.Range.Text
End If
If ctl.Tag = "Module" Then
m = m + 1
.Cell(Row:=m, Column:=2).Range.Text = ctl.Range.Text
End If
If ctl.Tag = "Description" Then
d = d + 1
.Cell(Row:=d, Column:=3).Range.Text = ctl.Range.Text
End If
Next ctl
End With
'
'Reset Values
Set oTable = Nothing: Set rng = Nothing: Set ctl = Nothing
End Sub