I create columns in codebehind as such.. each column is bound to a property.
Dim column_selected As New DataGridCheckBoxColumn()
column_selected.Header = "Selected"
column_selected.Binding = New Binding("IsChecked")
If logic of setting column visibility doesn't contains any business logic and this is clear UI operation. Then I think you can just put it in the code-behind, what is wrong with that?
<CheckBox Checked="HideColumn" Unchecked="UnhideColumn"/>
Protected Sub HideColumn() 'your code End Sub Protected Sub UnhideColumn() 'your code End Sub