Any particular reason that Sam spawned the button as a game object and later on grabbed the button component? Can’t you just instantiate it as a button in the first place? Presumably the latter is microscopically more efficient, but any downsides?
Button buttonInstance = Instantiate(buttonPrefab, contentRoot);
TMP_Text textComp = buttonInstance.GetComponentInChildren<TMP_Text>();
textComp.text = save;
buttonInstance.onClick.AddListener( () => savingWrapper.LoadGame(save) );