Wrapping the rotated contents in a box of fixed width you can easily manipulate the intended width of each column header. All of this, including the rotation, can be wrapped in a macro so that your code reads a little better. Moreover, some of the rotation and width specifications can be given default values so you only have to worry about them in special instances.
In the minimal example below, the command \rot[<angle>][<width>]{<stuff>}
rotates <stuff>
at angle <angle>
(defaults to 45
degrees) and fixes it to have a width of <width>
(default is 1em
). The first two arguments are optional, while the last is mandatory.
\documentclass{article}
\usepackage{graphicx} % http://ctan.org/pkg/graphicx
\usepackage{booktabs} % http://ctan.org/pkg/booktabs
\usepackage{xparse} % http://ctan.org/pkg/xparse
% Rotation: \rot[<angle>][<width>]{<stuff>}
\NewDocumentCommand{\rot}{O{45} O{1em} m}{\makebox[#2][l]{\rotatebox{#1}{#3}}}%
\begin{document}
% ===== DEFAULT ROTATION PARAMETERS
\begin{tabular}{lccc}
& \rot{Property 1}
& \rot{Property 2}
& \rot{Property 3} \\
\midrule
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\
\bottomrule
\end{tabular}
\bigskip
% ===== MODIFIED ANGLE ROTATION
\begin{tabular}{lccc}
& \rot[60]{Property 1}
& \rot[60]{Property 2}
& \rot[60]{Property 3} \\
\midrule
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\
\bottomrule
\end{tabular}
\bigskip
% ===== MODIFIED ANGLE & WIDTH ROTATION
\begin{tabular}{lccc}
& \rot[25][3em]{Property 1}
& \rot[25][3em]{Property 2}
& \rot[25][3em]{Property 3} \\
\midrule
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\
\bottomrule
\end{tabular}
\end{document}
To me, this allows for less manual interaction, since some of the parameters are set by default.