EDIT: Below was my original solution. It turns out that the problem was using a Canvas in the first place. By using a DockPanel, it has eliminated any need to recalculate sizes at all. This is similar to Blam's answer.
Forcing the Canvas to have a height/width did the trick. It refused to calculate the height before layout rendering since everything is dynamically sized, so the top level Panel inside of a Content object apparently must have a manually calculated size. Naturally that is where the XAML/C# barrier was, which hid the problem quite well.
The below code is what was missing. After I added it, the XAML and C# code from the original post all fell in line perfectly. Basically, the top level Panel must have a size for the lower level objects to dynamically size around it.
option.canvas.Height = OptionTabs.ActualHeight - tab.ActualHeight - tab.Margin.Bottom - tab.Margin.Top;
option.canvas.Width = OptionTabs.ActualHeight - tab.Margin.Right - tab.Margin.Left;