The structure of my wpf application is like:
You need to set a height on the inner ScrollViewer, otherwise it'll stretch as much as it needs based on it's content's size.
Also, the DataGrid has built-in properties for it's own ScrollBars which you can use instead of wrapping the DataGrid in a ScrollViewer. This will scroll the data and always leave the headers visible, instead of scrolling the entire datagrid.