I tried that and while it cleaned up my code (and some copy constructors, I'm sure), I still get the same sprite behavior.

I am sure all the textures are from the same Atlas and that the Atlas has the correct shared on it.
What else can I try?
P.S. The Prefab being loaded is a GameObject with a UISprite under it. That means that the top level GameObject in the prefab has a UIBasePanel script on it. (I didn't put it there, I think NGUI did when I created the sprite widget - disabling that script causes the sprite not to draw at all.)
void Start ()
{
Transform pTableTransform = gameObject.transform.FindChild("SubPanel/Table");
DebugUtils.Assert(pTableTransform != null);
mTableGameObject = pTableTransform.gameObject;
mTemplates = TrainTemplateLoader.loadAll();
int i = 0;
foreach(TrainTemplate pTrainTemplate in mTemplates)
{
// Col 1 - Picture
GameObject pCol1 = NGUITools.AddChild(mTableGameObject, Resources.Load("Prefabs/GUI/TrainTemplateTable/Col1") as GameObject);
pCol1.name = Convert.ToString(i++) + " - Col 1 - " + pTrainTemplate.Name;
UISprite pSprite = pCol1.transform.FindChild("Sprite").GetComponent<UISprite>();
pSprite.spriteName = pTrainTemplate.Icon;
pSprite.MakePixelPerfect();
// Col 2 - Text
GameObject pCol2 = NGUITools.AddChild(mTableGameObject, Resources.Load("Prefabs/GUI/TrainTemplateTable/Col2") as GameObject);
pCol2.name = Convert.ToString(i++) + " - Col 2 - " + pTrainTemplate.Name;
UILabel pLable = pCol2.transform.FindChild("Label").GetComponent<UILabel>();
DebugUtils.Assert(pLable != null);
pLable.text = "Name: " + pTrainTemplate.Name + "\nCost: $" + pTrainTemplate.Cost + "\nMax Speed: " + pTrainTemplate.CarSpeed[0];
}
}