Okay, I looked through your code and noticed that the widget's pos and size attributes are only updated when its respective cell's attributes are updated. I modified the SGridLayoutCell's add_widget method, as following, to make it work:
def add_widget(self, widget, row=0, col=0, width=1, height=1):
self.swidth = width
self.sheight = height
self.row = row
self.col = col
self.widget = widget
# They are updated now!
widget.pos = self.pos
widget.size = self.size
self.bind(pos=widget.setter('pos'))
if self.swidth == 1:
self.bind(width=widget.setter('width'))
else:
widget.width = self.width * self.swidth
if self.sheight == 1:
self.bind(height=widget.setter('height'))
else:
widget.height = self.height * self.sheight
Clock.schedule_once(self.post_init)