Because i is not changing within this loop, the same info is being pasted repeatedly.
For j = 2 To LastCol
.Cells(i, "A").Copy
Sheets(.Cells(i, "A").Value).Select
ActiveSheet.Cells(3, j).PasteSpecial Paste:=xlPasteValues
This tidies your code a little (no change in functionality)
Public Sub Populate()
Const InputCol As String = "A"
Dim i As Long
Dim j As Long
Dim LastRow As Long
Dim LastCol As Long
Dim sh As Worksheet
Dim ws As Worksheet
Set ws = ActiveSheet
Set sh = Sheet4
With sh
LastRow = .Cells(.Rows.Count, InputCol).End(xlUp).Row
LastCol = ws.Cells(4, ws.Columns.Count).End(xlToLeft).Column
For i = 7 To LastRow
For j = 2 To LastCol
.Cells(i, "A").Copy
Sheets(.Cells(i, "A").Value).Cells(3, j).PasteSpecial Paste:=xlPasteValues
.Cells(i, "B").Copy
Sheets(.Cells(i, "A").Value).Cells(4, j).PasteSpecial Paste:=xlPasteValues
Next j
Next i
End With
End Sub
If you could post a small sample showing Data on Sheet 4, Confirm what is the ActiveSheet, and an example of what you are after, this should be easily sorted.