The short answer to your question is: Yes, its possible. While this is a messy way of doing things, and I would not recommend doing it this way (unless you really have to, since I don't know your context details), here's the idea:
First problem is, Header binding seems to be broken somewhat. I was unable to bind to it through regular means except through Source={x:Static} to define an alternate datacontext.
Binding to a collection isn't possible in a Header binding, so you'll need to give it a scaler value OR write a converter that takes a parameter in and looks it up in your dictionary to return the real value.
And here's the sample code show how we did it to test the binding (without converter):
XAML
<Window x:Name="window" x:Class="WpfDataGridMisc.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="214" DataContext="{Binding Source={x:Static wpfDataGridMisc:PersonsViewModel.Instance}}"
xmlns:wpfDataGridMisc="clr-namespace:WpfDataGridMisc">
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Persons}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding FirstName}" Header="{Binding Source={x:Static wpfDataGridMisc:PersonsViewModel.Instance}, Path=Header1}" />
</DataGrid.Columns>
</DataGrid>
</Window>
PersonsViewModel
using System;
using System.Collections.ObjectModel;
namespace WpfDataGridMisc
{
public class PersonsViewModel
{
private static readonly PersonsViewModel Current = new PersonsViewModel();
public static PersonsViewModel Instance { get { return Current; } }
private PersonsViewModel()
{
Persons = new ObservableCollection<Person>
{
new Person {FirstName = "Thomas", LastName = "Newman", Date = DateTime.Now},
new Person {FirstName = "Dave", LastName = "Smith", Date = DateTime.Now},
};
Header1 = "Header 1";
}
public ObservableCollection<Person> Persons { get; private set; }
public string Header1 { get; set; }
}
}
Person class is a standard poco deducable from Person in code above.
Credit: Thanks to Johan Larsson for the bulk of code. He was working on this solution and I was just helping but he felt I should post the answer as x:Static was my idea.