2 of 2 Fixed formatting to make sense, doubled backslashes so they do what they’re intended to (prev. example code was broken)

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.

rotated table examples

\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.