row is an object inside lst.  When you update row with row.pop(), you're removing your items from the row.
>>> lst = []
>>> n=0
>>> for i in ["2","3"]:
...     print("\n Running loop:%d"%(n))
...     print("1",lst)
...     row = [] #<- Your redefining row here, the old connection is gone
...     print("2",lst)
...     row.append(i)
...     for j in ["2","3"]:
...         row.append(j) #
...         lst.append(row) #<- you're duplicating the row here on the second pass through the "j" loop, so now you have the same object twice in lst
...         print("2.1",lst)
...         x=row.pop(-1) #<- you're removing the value from row that you just added...
...         print("2.2",lst)
...     x=row.pop(-1)  #<-  You have one value on row, and you're removing that one here
...     print("3",lst)
...     n+=1
...
...
 Running loop:0
1 []
2 []
2.1 [['2', '2']]
2.2 [['2']]
2.1 [['2', '3'], ['2', '3']]
2.2 [['2'], ['2']]
3 [[], []]
 Running loop:1
1 [[], []]
2 [[], []]
2.1 [[], [], ['3', '2']]
2.2 [[], [], ['3']]
2.1 [[], [], ['3', '3'], ['3', '3']]
2.2 [[], [], ['3'], ['3']]
3 [[], [], [], []]
>>>
>>> print("lst",lst)
lst [[], [], [], []]
You can insert your list on the fly like this, no need to make an intermediate.
>>> lst = []
>>> for i in ["2","3"]:
...     for j in ["2","3"]:
...         lst.append([i,j])
...
>>>
>>> print("lst",last)
lst [['2', '2'], ['2', '3'], ['3', '2'], ['3', '3']]